"""
在梯度下降中，我们需要找到一个合适的学习率learning_rate很困难
因此"牛顿法"可以在没有learning_rate的情况下使用
它将 SGD的梯度下降模式改变为  一阶导数 / 二阶导数模式

优点：
牛顿法在凸问题中一旦开始工作，速度就会快很多

缺点：
对于非凸问题，需要对牛顿法做出一定调整，否则没有任何意义
"""

import numpy as np
import matplotlib.pyplot as plt

w = np.linspace(-1, 1, 30)
e = w ** 2

current_w = max(w)

num_epochs = 10
predict_w = []
for i in range(num_epochs):
    predict_w.append(current_w)
    slope = 2 * current_w
    slope_hess = 2
    # SGD 小固定值 * 斜率
    current_w -= slope / slope_hess
    predict_w.append(current_w)

predict_w = np.array(predict_w)
plt.plot(w, e, 'r-')
plt.plot(predict_w, predict_w ** 2, 'bo-')
plt.show()